/*
 * This file is part of the OSMembrane project.
 * More informations under www.osmembrane.de
 * 
 * The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
 * for more details about the license see http://www.osmembrane.de/license/
 * 
 * Source: $HeadURL: http://osmembrane-gui.googlecode.com/svn/sources/src/de/osmembrane/resources/Resource.java $ ($Revision: 821 $)
 * Last changed: $Date: 2011-02-15 14:54:41 +0000 (Tue, 15 Feb 2011) $
 */



package de.osmembrane.resources;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;

import javax.swing.ImageIcon;

import de.osmembrane.model.ModelProxy;
import de.osmembrane.model.settings.SettingType;
import de.osmembrane.tools.IconLoader;

/**
 * Resource enum for various files used in OSMembrane.
 * 
 * @author jakob_jarosch
 */
public enum Resource {
	/**
	 * The resource bundle for cursor icons.
	 */
	CURSOR_ICON("/de/osmembrane/resources/cursors/", null, false),

	/**
	 * The resource bundle for program icons in the tool bar and in the menus.
	 */
	PROGRAM_ICON("/de/osmembrane/resources/images/icons/",
			new String[] { "resources/images/icons/" }, false),

	/**
	 * The resource bundle for preset icons used in the presets from josm.
	 */
	PRESET_ICON("/de/osmembrane/resources/images/icons/presets/",
			new String[] { "resources/images/icons/presets/" }, true),

	/**
	 * The resource xml file for osmosis tasks used by OSMembrane.
	 */
	OSMEMBRANE_XML("/de/osmembrane/resources/xml/osmosis-structure.xml",
			new String[] { "resources/xml/osmosis-structure.xml" }, true),

	/**
	 * The resource xml file for josm presets used by OSMembrane.
	 */
	PRESET_XML("/de/osmembrane/resources/xml/defaultpresets.xml",
			new String[] { "resources/xml/defaultpresets.xml" }, true),

	/**
	 * The resource bundle for quickstart images.
	 */
	QUICKSTART_IMAGE("/de/osmembrane/resources/images/quickstart/",
			new String[] { "resources/images/quickstart/" }, true);

	private String internalPath;
	private String[] externalPath;
	private boolean externalPrefered;
	private boolean silentLoad = false;

	/**
	 * Create a new Resource enum.
	 * 
	 * @param internalPath
	 *            path to the internal files
	 * @param externalPath
	 *            path to the externals files
	 * @param externalPrefered
	 *            select if internal or external files are preferred
	 */
	Resource(String internalPath, String[] externalPath,
			boolean externalPrefered) {

		this.internalPath = internalPath;
		this.externalPath = externalPath;
		this.externalPrefered = externalPrefered;
	}

	/**
	 * @see Resource#getURL(String)
	 */

	public URL getURL() {
		return getURL("");
	}

	/**
	 * Returns the URL to a given file in the resource
	 * 
	 * @param file
	 *            inside the resource
	 * @return the URL to the file inside the resource, or NULL if no resource
	 *         was found
	 */

	public URL getURL(String file) {
		URL url = null;
		url = selectURL(getLocalizedFile(file));
		if (url == null) {
			url = selectURL(file);
		}
		return url;
	}

	/**
	 * @see Resource#getImageIcon(String, de.osmembrane.tools.IconLoader.Size)
	 */
	public ImageIcon getImageIcon(IconLoader.Size size) {
		return getImageIcon("", size);

	}

	/**
	 * Returns a image as a {@link ImageIcon} from the resource.
	 * 
	 * @param filename
	 *            file inside the resource
	 * @param size
	 *            size for the {@link ImageIcon}
	 * @return selected image icon which should be loaded, or NULL if no image
	 *         was found
	 */
	public ImageIcon getImageIcon(String filename, IconLoader.Size size) {
		return new IconLoader(getURL(filename), size, silentLoad).get();
	}

	/**
	 * Returns a localized variant of the filename.
	 * 
	 * @param file
	 *            filename which should be localized
	 * @return localized variant of the filename
	 */

	private String getLocalizedFile(String file) {
		Locale locale = (Locale) ModelProxy.getInstance().getSettings()
				.getValue(SettingType.ACTIVE_LANGUAGE);
		String newFile;
		int lastDot = file.lastIndexOf(".");

		if (lastDot > 0) {
			newFile = file.substring(0, lastDot);
			newFile += "." + locale.getLanguage() + file.substring(lastDot);
		} else {
			newFile = file;
		}

		return newFile;
	}

	/**
	 * Returns the external path to a file, by iterating over all paths and
	 * search for a available resource.
	 * 
	 * @param file
	 *            which should be found
	 * @return the URL to an external file, or NULL if the file was nowhere
	 *         found
	 */
	private URL getExternalUrl(String file) {
		if (externalPath == null) {
			return null;
		}
		for (String externalPath : this.externalPath) {
			File fileObject = new File(externalPath + file);
			if (fileObject.exists()) {
				try {
					return fileObject.toURI().toURL();
				} catch (MalformedURLException e) {
					/* try silently another one */
				}
			}
		}
		return null;
	}

	/**
	 * Returns the correct file, and chooses the right one from internal or
	 * external path.
	 * 
	 * @param file
	 *            filename which should be loaded
	 * @return the correct URL to the file, or NULL if the file couldn't be
	 *         found anywhere.
	 */
	private URL selectURL(String file) {
		URL url = null;
		if (externalPrefered) {
			url = getExternalUrl(file);
			if (url == null) {
				url = this.getClass().getResource(internalPath + file);
			}
		} else {
			url = this.getClass().getResource(internalPath + file);
			if (url == null) {
				url = getExternalUrl(file);
			}
		}

		return url;
	}
}
